/*
 * Copyright (C) 2013 Félix Marín Ramírez | felixmurcia@gmail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * DOCUMENTACION: http://documentacion-emple-depart.tk
 */
package adgui.vista;

import adgui.controlador.ControlAltaEmple;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author Félix Marín Ramírez | felixmurcia@gmail.com
 * @version 1.0
 */
public final class AltaEmple extends JPanel {

    private ControlAltaEmple cInsertEmple;
    private ConsultarEmple vConsultarEmple;
    //--//
    private JPanel panelB, panelC;
    //--//
    private JLabel lbEncabezado, lbApellido, lbOficio, lbDrector, lbSalario,
            lbDepartamento, lbComision;
    //---//
    private JTextField tfApellido, tfSalario, tfComision, tfResultados;
    //---//
    private JComboBox cbOficio, cbDirector, cbDepartamento;
    //---//
    private JButton btnInsertar, btnVerificar;
    //--//
    private GridBagLayout gbl;
    private GridBagConstraints gbc;

    /**
     * Constructor de la clase encargado de inicializar todos los elementos del
     * JPanel.
     */
    public AltaEmple() {
        this.panelB = new JPanel();
        panelB.setLayout(new BorderLayout());
        this.panelC = new JPanel();
        panelC.setLayout(new BorderLayout());
        this.gbl = new GridBagLayout();
        this.gbc = new GridBagConstraints();
        this.gbc.insets = new Insets(3, 3, 3, 3);
        this.gbl.setConstraints(this, gbc);
        this.setLayout(gbl);
        this.vConsultarEmple = new ConsultarEmple();
        try {
            cInsertEmple = new ControlAltaEmple(this);
        } catch (SQLException | ClassNotFoundException ex) {
            this.mensajeError(ex.getMessage());
        }

        this.crearPrimeraLinea();
        this.crearSegundaLinea();
        this.crearTerceraLinea();
        this.crearCuartaLinea();
        this.crearQuintaLinea();
        this.crearSextaLinea();
        this.crearSeptimaLinea();
        this.crearOctavaLinea();
        this.setListeners();

        btnInsertar.setEnabled(false);

        this.setVisible(true);
        panelB.add(this, BorderLayout.LINE_START);
        panelC.add(panelB, BorderLayout.NORTH);
    }

    /**
     *
     * @return Devuelve el panel con todos los elementos insertados y con sus
     * debidos layouts implementados.
     */
    public JPanel getJPanel() {
        return panelC;
    }

    /**
     *
     * @return Devuelve el apellido.
     */
    public JTextField getTfApellido() {
        return this.tfApellido;
    }

    /**
     *
     * @return Devuelve el salario.
     */
    public JTextField getTfSalario() {
        return this.tfSalario;
    }
    
    /**
     * 
     * @return Devuelve el combo de los oficios.
     */
    public JComboBox getComboOficio() {
        return cbOficio;
    }
    
    /**
     * 
     * @return Devuelve el combo de los Directores.
     */
    public JComboBox getComboDirector() {
        return cbDirector;
    }
    
    /**
     * 
     * @return Devuelve el combo de los departamentos.
     */
    public JComboBox getComboDepart() {
        return cbDepartamento;
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoApellido(String texto) {
        this.tfApellido.setText(texto.toUpperCase());
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoSalario(String texto) {
        this.tfSalario.setText(texto);
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoComision(String texto) {
        this.tfComision.setText(texto);
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoResultados(String texto) {
        this.tfResultados.setText(texto);
    }

    /**
     * Método encargado de mostrar los errores producidos durante la ejecución
     * de la aplicación.
     *
     * @param mensaje Texto que será mostrado cuando se lance esta ventana.
     */
    public void mensajeError(String mensaje) {
        JOptionPane.showMessageDialog(null, mensaje, "Error",
                JOptionPane.ERROR_MESSAGE);
    }

    /**
     * Método encargado de crear la primera línea del JPanel.
     */
    private void crearPrimeraLinea() {
        this.setRestricciones(0, 0, 2);
        this.lbEncabezado = new JLabel("Alta Empleado");
        this.lbEncabezado.setFont(new Font("sans", Font.BOLD, 20));
        this.add(this.lbEncabezado, this.gbc);
    }

    /**
     * Método encargado de crear la segunda línea del JPanel.
     */
    private void crearSegundaLinea() {
        this.setRestricciones(0, 2, 1);
        this.lbApellido = new JLabel("Apellido");
        this.add(this.lbApellido, this.gbc);

        this.setRestricciones(1, 2, 2);
        this.tfApellido = new JTextField();
        this.add(this.tfApellido, this.gbc);

        this.setRestricciones(3, 2, 1);
        this.btnVerificar = new JButton("Verificar");
        this.btnVerificar.setMnemonic(KeyEvent.VK_V);
        this.add(btnVerificar, gbc);
    }

    /**
     * Método encargado de crear la tercera línea del JPanel.
     */
    private void crearTerceraLinea() {
        this.setRestricciones(0, 3, 1);
        this.lbOficio = new JLabel("Oficio");
        this.add(this.lbOficio, this.gbc);

        this.setRestricciones(1, 3, 2);
        this.cbOficio = new JComboBox();
        cInsertEmple.setComboOficio();
        this.add(this.cbOficio, this.gbc);

    }

    /**
     * Método encargado de crear la cuarta línea del JPanel.
     */
    private void crearCuartaLinea() {
        this.setRestricciones(0, 4, 1);
        this.lbDrector = new JLabel("Director");
        this.add(lbDrector, gbc);

        this.setRestricciones(1, 4, 2);
        this.cbDirector = new JComboBox();
        cInsertEmple.setComboDirector();
        this.add(cbDirector, gbc);
    }

    /**
     * Método encargado de crear la quinta línea del JPanel.
     */
    private void crearQuintaLinea() {
        this.setRestricciones(0, 5, 1);
        this.lbSalario = new JLabel("Salario");
        this.add(lbSalario, gbc);

        this.setRestricciones(1, 5, 2);
        this.tfSalario = new JTextField();
        this.add(tfSalario, gbc);
    }

    /**
     * Método encargado de crear la sexta línea del JPanel.
     */
    private void crearSextaLinea() {
        this.setRestricciones(0, 6, 1);
        this.lbDepartamento = new JLabel("Departamento");
        this.add(lbDepartamento, gbc);

        this.setRestricciones(1, 6, 2);
        this.cbDepartamento = new JComboBox();
        cInsertEmple.setComboDepart();
        this.add(cbDepartamento, gbc);
    }

    /**
     * Método encargado de crear la séptima línea del JPanel.
     */
    private void crearSeptimaLinea() {
        this.setRestricciones(0, 7, 1);
        this.lbComision = new JLabel("Comisión");
        this.add(lbComision, gbc);

        this.setRestricciones(1, 7, 2);
        this.tfComision = new JTextField();
        this.tfComision.setEditable(false);
        this.add(tfComision, gbc);
    }

    /**
     * Método encargado de crear la octava línea del JPanel.
     */
    private void crearOctavaLinea() {
        this.setRestricciones(0, 8, 3);
        this.tfResultados = new JTextField();
        this.tfResultados.setEditable(false);
        this.add(tfResultados, gbc);

        this.setRestricciones(3, 8, 1);
        this.btnInsertar = new JButton("Insertar");
        this.btnInsertar.setMnemonic(KeyEvent.VK_I);
        this.add(btnInsertar, gbc);
    }

    /**
     * Método encargado de establecer los parámetros de las varables que
     * establecerán las posiciones de los elementos en el JPanel.
     *
     * @param gridx Posicione X con respecto a la esquna superior izquierda del
     * JPanel.
     * @param gridy Posicione Y con respecto a la esquna superior izquierda del
     * JPanel.
     * @param gridwidth Número de columnas que ocupará el elemento dentro del
     * GridBagLayout del JPanel.
     */
    private void setRestricciones(int gridx, int gridy, int gridwidth) {
        this.gbc.gridx = gridx;
        this.gbc.gridy = gridy;
        this.gbc.gridheight = 1;
        this.gbc.gridwidth = gridwidth;
        this.gbc.fill = GridBagConstraints.BOTH;
        this.gbc.ipadx = 20;
        this.gbc.ipady = 20;
    }

    /**
     * Método encargado de establecer los listener de los elementos que los
     * necesiten.
     */
    private void setListeners() {
        cbOficio.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                String jcb = (String) e.getItem();
                try {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        cInsertEmple.setOficio(jcb);
                    }
                } catch (ArrayIndexOutOfBoundsException ex) {
                    //DO NOTHING
                }
            }
        });

        cbDirector.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                String jcb = (String) e.getItem();
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    try {
                        cInsertEmple.setDirector(
                                cInsertEmple.getmInsertEmple().getNumDir(jcb));
                    } catch (ArrayIndexOutOfBoundsException ex) {
                        //DO NOTHING
                    }
                }
            }
        });

        cbDepartamento.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                String jcb = (String) e.getItem();
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    try {
                        cInsertEmple.setDepartamento(cInsertEmple
                                .getmInsertEmple().getNumDep(jcb));
                    } catch (SQLException | ClassNotFoundException ex) {
                        mensajeError(ex.getMessage());
                    } catch (ArrayIndexOutOfBoundsException ex) {
                        //DO NOTHING
                    }
                }
            }
        });


        btnVerificar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    cInsertEmple.recargar();
                    cInsertEmple.calcularComision();
                    cInsertEmple.calcularEmpNo();
                } catch (NumberFormatException ex) {
                    mensajeError(ex.getMessage());
                }
                if (!btnInsertar.isEnabled() && !tfComision
                        .getText().equals("")) {
                    btnInsertar.setEnabled(true);
                }
            }
        });

        btnInsertar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    cInsertEmple.insertarEmple();
                    cInsertEmple.recargar();
                    cInsertEmple.eliminarItemsDelCombo(vConsultarEmple.getComboEmple());
                    vConsultarEmple.getControlConsEmple().setComboEmple();
                } catch (SQLException ex) {
                    mensajeError(ex.getMessage());

                }
            }
        });
    }
}
